/**
 * 该文件为路由接口（登录、注册、验证token等接口）
 * 接口统一返回格式为
 *      {
 *          code:1000,1000为成功，1001为数据库出错，
 *                  1002为系统内部插件出错,1003为成功但数据不对（如密码错误等）
 *          message:"修改成功",返回信息字段
 *          data:[],返回的数据字段
 *          status:200,表示正常返回了数据
 *      }
 */
const express = require("express");
const router = express.Router();

//引入数据库Model
const User = require("../../models/User.js");

//引入加密文件
const { setPassword, getPassword } = require("../../utils/encryption.js");

//引入头像文件
const gravatar = require("gravatar");

//引入jwt和加密名
const jwt = require("jsonwebtoken");
const secretOrKey = require("../../config/keys.js").secretOrKey;

//引入passport
const passport = require("passport");

//引入全局输出类
const JsonResult=require("../global/JsonResult.js");

// 引入相关模型
const ImageModel=require("../../models/Images.js");

//注册接口--（/api/users/register）
router.post("/register", (req, res) => {
    // console.log(req.body);
    //查询数据库中是否有此邮箱 
    // 第一种写法
    // User.findOne({ email: req.body.email }, async function(err, data) {
    //     if (err) {
    //         console.log(err);
    //         res.json({
    //             message: "数据库查询出错"
    //         });
    //     } else {
    //         // console.log(data);
    //         if (data) {
    //             return res.status(400).json({ message: "邮箱已被注册" });
    //         } else {
    //             const newUser = new User({
    //                 name: req.body.name,
    //                 password: req.body.password,
    //                 email: req.body.email
    //             });
    //             //密码加密存入数据库
    //             newUser.password = await setPassword(newUser.password);
    //             newUser.save(function(err1, data1) {
    //                 if (err1) {
    //                     console.log(err1);
    //                     res.json({
    //                         message: "数据库新增出错"
    //                     });
    //                 } else {
    //                     res.json(data1);
    //                 };
    //             });
    //         };
    //     };
    // });

    //第二种写法
    User.findOne({
        email: req.body.email
    }).then(async(data) => {
        if (data) {
            res.json(JsonResult.successNo("邮箱已被注册",null));
        } else {
            const avatar = gravatar.url(req.body.email, {
                s: "200",
                r: "pg",
                d: "mm"
            });
            const newUser = new User({
                name: req.body.name,
                password: req.body.password,
                email: req.body.email,
                avatar,
                identify: req.body.identify?req.body.identify:"employee"
            });
            //密码加密存入数据库
            newUser.password = await setPassword(newUser.password);
            newUser.save().then((data1) => {
                // res.json(data1);
                // console.log("新增的数据", data1);
                res.json(JsonResult.success("新增成功",null));
            }).catch((err1) => {
                // console.log(err1);
                res.status(500).json(JsonResult.databaseError("数据库新增出错",null));
            });
        };
    }).catch((err) => {
        // console.log(err);
        res.status(500).json(JsonResult.databaseError("数据库查询出错",null));
    });
});

//登录接口--(/api/users/login)
router.post("/login", (req, res) => {
    User.findOne({
        email: req.body.email
    }).then(async(doc) => {
        // console.log(doc);
        if (!doc) {
            res.json(JsonResult.successNo("该用户不存在",null));
        } else {
            let passwordResult = await getPassword(req.body.password, doc.password);
            if (passwordResult) {
                // 获取个人图片
                const image=await ImageModel.findOne({email:doc.email}).then((res)=>{
                    if(res){
                        return res.image;
                    };
                });
                // jwt.sign("规则","加密名","过期时间","回调函数");
                const rule = {
                    id: doc.id,
                    name: doc.name,
                    identify: doc.identify
                };
                jwt.sign(rule, secretOrKey, { expiresIn: 7*24*60*60 }, (err, token) => { //token有效时间为三小时
                    if (err) {
                        // console.log(err);
                        res.status(500).json(JsonResult.systemError("系统错误",null));
                    } else {
                        res.json(JsonResult.success("登录成功",{
                            userInfo:{
                                name:doc.name,
                                email:doc.email,
                                avatar:image || doc.avatar,
                                identify:doc.identify || "employee" //若没有填写身份，则默认为普通人员登录
                            },
                            token:"Bearer "+token
                        }));
                    };
                });
            } else {
                res.json(JsonResult.successNo("密码错误",null));
            };
            
        };
    }).catch((err) => {
        // console.log(err);
        res.status(500).json(JsonResult.databaseError("数据库查询出错",null));
    });
});

// 引入查询条件和配置项
const UserParams=require("../conditions/userParams.js");

//获取所有用户接口（/api/users）
router.get("/",passport.authenticate("jwt",{session:false}),async (req,res)=>{
    let counts=UserParams.counts;
    let userOptionsObj=UserParams.userOptionsObj(req.query);
    let userDataObj=UserParams.userDataObj(req.query);
    // 先查询该集合的总数量
    await User.count().then((count)=>{
        counts=count;
    }).catch((err)=>{
        console.log(err);
        res.status(500).json(JsonResult.databaseError("数据库操作出错",null));
    });
    // 获取该集合中的数据
    User.find(userDataObj,null,userOptionsObj).then((doc)=>{
        // console.log(doc);
        res.json(JsonResult.success("查询成功",{
            currentPage:req.query.pageNum?req.query.pageNum:1,
            currentSize:req.query.pageSize?req.query.pageSize:5,
            data:doc.map((item)=>{
                return {
                    id:item._id,
                    name:item.name,
                    email:item.email,
                    identify:item.identify,
                    date:item.date,
                    updateTime:item.updateTime
                };
            }),
            total:counts
        }));
    }).catch((err)=>{
        console.log(err);
        res.status(500).json(JsonResult.databaseError("数据库查询出错",null));
    });
});

// 修改用户信息接口（/api/users/:id）
router.patch("/:id",passport.authenticate("jwt",{session:false}),(req,res,next)=>{
    User.findOne({_id:req.params.id}).then(async (doc)=>{
        if(req.body.newPassword && req.body.oldPassword){ // 若有传入新密码，则表示需要改密码
            // console.log(doc,req.body);
            let passwordResult=await getPassword(req.body.oldPassword,doc.password);
            if(passwordResult){
                let newPassword=await setPassword(req.body.newPassword);
                User.findByIdAndUpdate(req.params.id,{
                    $set:{
                        password:newPassword,
                        name:req.body.name,
                        updateTime:Date.now()
                    }
                },{new:true}).then((result)=>{
                    res.json(JsonResult.success("修改成功",{
                        name:result.name
                    },null));
                });
            }else{
                res.json(JsonResult.successNo("旧密码输入错误",null));
            };
        }else{ //若未传入新密码，则表示不需要改密码，无论是否传入旧密码是否正确
            User.findByIdAndUpdate(req.params.id,{
                $set:{
                    name:req.body.name,
                    updateTime:Date.now()
                }
            },{new:true}).then((result)=>{
                res.json(JsonResult.success("修改成功",{
                    name:result.name
                },null));
            });
        };
    });
});

// 修改密码接口--(/api/users/updatePassword)
router.put("/updatePassword",passport.authenticate("jwt", { session: false }),(req,res,next)=>{
    User.findOne({
        email:req.body.email
    }).then(async (doc)=>{
        if(!doc){
            res.json(JsonResult.successNo("该用户不存在",null));
        }else{
            console.log(doc);
            const newPassword=await setPassword(req.body.password);
            User.findByIdAndUpdate(doc._id,{
                $set:{
                    password:newPassword,
                    updateTime:Date.now()
                }
            },{new:false}).then((result)=>{
                res.json(JsonResult.success("修改成功",null));
            });
        };
    })
});


//token验证接口，内部接口--(/api/users/current)
router.get("/current", passport.authenticate("jwt", { session: false }), (req, res) => {
    // console.log(req.user, req.authInfo);
    res.json({
        code: 1000,
        message: "验证token成功",
        data: {
            id: req.user.id,
            name: req.user.name,
            email: req.user.email,
            avatar: req.user.avatar,
            identify: req.user.identify
        },
        status: 200
    });
});
// router.get("/current", (req, res, next) => {
//     passport.authenticate("jwt", { session: false }, (err, user, info) => {
//         if (err) {
//             console.log(err);
//         } else {
//             console.log(user, info);
//             if (user) {
//                 res.json(JsonResult.success("验证token成功",{
//                     id: user.id,
//                     name: user.name,
//                     email: user.email,
//                     avatar: user.avatar,
//                     identify: user.identify
//                 }));
//             } else {
//                 res.status(500).json(JsonResult.databaseError("token已过期，请重新登录",null));
//             };
//         };
//     })(req, res, next);
// });

module.exports = router;